Replication, in computing context, refers to copying, or replicating, a computing environment (e.g., a server system) multiple times to increase availability of services provided through that computing environment. Each replica or copy receives the same input, performs the same operations, and produces the same output. As a result, the replicated computing environment or server system remains operational as a collective sum, even if one of the replicas becomes non-operational.
Unfortunately, existing systems and methods for replicating a server system fail to efficiently support interactions with non-deterministic data sources. A non-deterministic data source refers to a data source (e.g., a database) that may return a different output each time, in response to receiving the same input. For example, a database that is dynamically updated by multiple independent processes may return different results for a query each time depending on the point in time in which the query is performed.
In one existing implementation, non-deterministic data sources may be supported by synchronizing the state of each replica with the state of a selected replica at certain points in time (i.e., checkpoints). In another existing implementation, access to each non-deterministic data source may be synchronized using a locking mechanism. Such existing implementations, however, result in high overhead, particularly with respect to the time required to respond to a client request.